﻿using System.Numerics;

namespace System.NETool;

/// <summary>
/// 提供扩展方法用于比较值类型的最小值和最大值。
/// </summary>
public static class ValueTypeEx
{
    /// <summary>
    /// 返回两个值中较小的一个。
    /// </summary>
    /// <typeparam name="T">值类型，必须实现 <see cref="IComparable{T}"/> 和 <see cref="INumberBase{T}"/> 接口。</typeparam>
    /// <param name="this">第一个值。</param>
    /// <param name="value">第二个值。</param>
    /// <returns>两个值中较小的一个。</returns>
    public static T Min<T>(this T @this, T value) where T : IComparable<T>, INumberBase<T>
    {
        return @this.CompareTo(value) < 0 ? @this : value;
    }

    /// <summary>
    /// 返回两个值中较大的一个。
    /// </summary>
    /// <typeparam name="T">值类型，必须实现 <see cref="IComparable{T}"/> 和 <see cref="INumberBase{T}"/> 接口。</typeparam>
    /// <param name="this">第一个值。</param>
    /// <param name="value">第二个值。</param>
    /// <returns>两个值中较大的一个。</returns>
    public static T Max<T>(this T @this, T value) where T : IComparable<T>, INumberBase<T>
    {
        return @this.CompareTo(value) > 0 ? @this : value;
    }

    /// <summary>
    /// 判断当前值是否在指定的范围内（包括边界值）。
    /// </summary>
    /// <typeparam name="T">值类型，必须实现 <see cref="IComparable{T}"/> 和 <see cref="INumberBase{T}"/> 接口。</typeparam>
    /// <param name="this">当前值。</param>
    /// <param name="minValue">范围的最小值。</param>
    /// <param name="maxValue">范围的最大值。</param>
    /// <returns>如果当前值在指定范围内（包括边界值），则返回 <c>true</c>；否则返回 <c>false</c>。</returns>
    public static bool InRange<T>(this T @this, T minValue, T maxValue) where T : IComparable<T>, INumberBase<T>
    {
        return @this.CompareTo(minValue) >= 0 && @this.CompareTo(maxValue) <= 0;
    }
}
